class Solution {
private:
    int m,n;
    int dx[4]={0,0,-1,1};
    int dy[4]={-1,1,0,0};
public:
    int cutOffTree(vector<vector<int>>& f) 
    {
        m=f.size();n=f[0].size();
        vector<vector<int>> trees;
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(f[i][j]>1)
                    trees.push_back({f[i][j],i,j});
            }
        }
        sort(trees.begin(),trees.end());

        int ret=0;
        int bx=0;int by=0;
        for(int i=0;i<trees.size();i++)
        {
            int path=bfs(f,bx,by,trees[i][1],trees[i][2]);
            if(path==-1)    return -1;
            else    ret+=path;
            bx=trees[i][1];
            by=trees[i][2];
        }
        return ret;
    }

    int bfs(vector<vector<int>>& f,int bx,int by,int ex,int ey)
    {
        if(bx==ex&&by==ey)    return 0;
        int path=0;
        bool check[51][51]={};
        queue<pair<int,int>> q;
        q.push({bx,by});
        check[bx][by]=true;
        while(!q.empty())
        {
            int size=q.size();
            for(int i=0;i<size;i++)
            {
                auto top=q.front();
                q.pop();
                if(top.first==ex&&top.second==ey)
                {
                    return path;
                }   
                for(int j=0;j<4;j++)
                {
                    int x=top.first+dx[j];
                    int y=top.second+dy[j];
                    if(x>=0&&y>=0&&x<m&&y<n&&check[x][y]==false&&f[x][y]!=0)
                    {
                        q.push({x,y});
                        check[x][y]=true;
                    }
                }
            }
            path++;
        }
        return -1;
    }
};

